home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
pcd2
/
src
/
pcd_pf.has
< prev
next >
Wrap
Text File
|
1997-02-27
|
15KB
|
837 lines
**************************************************
* PhotoCD Portfolioに対応部分
*
* 著作権はFa.Tom氏と同じく可能な限り放棄
* 改造等は、貴方の良心に従って下さい
* 実行形式・ソース共、利用に制限はありませんが
* 無保証であることだけは保証します
* by まる丸 1997
**************************************************
*------------------------------
* インクルード&外部参照
*------------------------------
.include doscall.mac
.include iocscall.mac
.xref Fsize,Fname
.xref PCD_MAIN
.xref V_FLAME,GA_wipe,FLG_WP
.xref IMAGE_NUM,SW_S,SW_LX,SW_LY,SW_PF,FLG_V,SW_P
.xref MS_INIT,MS_CHECK,MScsrON,MScsrOFF,limitB,G_MODE
.xdef PF_PLAY,K_Clear,PlayAudioMSF
.xdef KEY_DATA,key_chk,Wipe
.xdef M_TBL_X,M_TBL_Y,M_TBL_J,SEL
.xdef Now,Previous,Next,MenuErr,MN_FLG,W_Time
*------------------------------
* プログラム部
*------------------------------
.cpu 68000
.text
.align 4
*------------------------------
* ファイル名を調べ
* PLAYLIST.PCDならPortfolio再生
*------------------------------
PF_PLAY:
movem.l d2-d5/a0/a5,-(sp)
move.w IMAGE_NUM,d2
move.w SW_LX,d3
move.w SW_LY,d4
move.w d0,FHdl
lea.l FNAME1,a0
bsr namechek
tst.b d0
bne @f
st.b SW_PF
bsr PF_INIT
tst.l d0
bmi PF_exit
bsr PF_MAIN
bsr PF_END
bra PF_exit
@@: moveq.l #1,d0
PF_exit:
move.w d2,IMAGE_NUM
move.w d3,SW_LX
move.w d4,SW_LY
cmpi.b #2,d2
beq @f
clr.b FLG_WP
@@: clr.b SW_PF
bsr K_Clear *キーバッファクリア
movem.l (sp)+,d2-d5/a0/a5
rts
*------------------------------
* 初期設定
*------------------------------
PF_INIT:
movem.l d3,-(sp)
move.l Fsize,-(sp) *PLAYLIST.PCDを
DOS _MALLOC *読み込むメモリ
addq.l #4,sp *を確保
tst.l d0
bmi mem_err_exit
move.l d0,a5
move.l Fsize,-(sp) *PLAYLIST.PCDを
move.l d0,-(sp) *読み込み
move.w FHdl,-(sp)
DOS _READ
lea 10(sp),sp
tst.l d0
bmi re_err_exit *エラーならリターン
cmp.l Fsize,d0 *エラーが出なくても
beq 1f *正しく読み込めない
tst.b SW_P *場合が有るので
bne 1f * -Pで処理を振り分ける
moveq.l #-6,d3
bra 2f
1: bsr MS_INIT *マウス関連初期化
bsr l_space *画像の表示位置決定
clr.l d5 *PLAYLIST.PCDの最初
clr.l d0 *初期設定正常
movem.l (sp)+,d3
rts
re_err_exit:
moveq.l #-1,d3
2: move.l a5,-(sp)
DOS _MFREE
addq.l #4,sp
move.l d3,d0
movem.l (sp)+,d3
rts
mem_err_exit:
move.l #-3,d0
movem.l (sp)+,d3
rts
*------------------------------
* PhotoCD Portfolioの再生
* PLAYLIST.PCDの内容を
* 0(a5,d5) でアクセス
*------------------------------
PF_MAIN:
movem.l d7/a6,-(sp)
m_loop: move.l d5,d7
bsr get_word
lea.l (menu_sub),a6
cmpi.w #$1000,d0
beq @f
lea.l (play_sub),a6
cmpi.w #$2000,d0
bne 1f
@@: jsr (a6)
tst.l d0
bmi 2f
move.l d0,d5
bra m_loop
1: move.l #-5,d0 *ファイルが変
bra @f
2: cmpi.w #-6,d0 *正常終了か
bne @f *異状ならそのまま
clr.l d0 *正常終了なら 0を返す
@@: movem.l (sp)+,d7/a6
rts
*------------------------------
* 後片付け
*------------------------------
PF_END:
movem.l d0,-(sp)
move.l a5,-(sp)
DOS _MFREE
addq.l #4,sp
* move.l S_MM,E_MM *SUSIE対策2
* bsr PlayAudioMSF *演奏停止
pea.l PAN *ダミー
move.w #$8003,-(sp) *コマンド番号(停止)
clr.w -(sp) *カレントドライブ
move.w #13,-(sp)
DOS _IOCTRL *ドライバコール
lea.l 10(sp),sp
movem.l (sp)+,d0
rts
*------------------------------
* メニューの処理
*------------------------------
menu_sub:
movem.l d1-d6/a0,-(sp)
st.b MN_FLG
move.l d7,Now
bsr get_byte
clr.w d6
cmpi.b #100,d0
bcs @f
move.b #99,d0
@@: move.b d0,d6 *選択肢の数
move.w d6,SEL
moveq.l #3,d1
lea.l Previous,a0
@@: bsr get_long
tst.l d0
bge 9f
move.l d7,d0
9: move.l d0,(a0)+
dbra d1,@b
move.l d7,MenuErr *メニューエラーの処理を潰す
lea.l M_TBL_J,a0
@@: bsr get_word *大量の0000とFFFFを
tst.w d0 *スキップ
ble @b
clr.b MU_FLG
bsr pic_audio *画像と音声
add.l #24,d5
tst.l AUDIO_BUF *音声の再生が有るか
bne @f
add.l #28,d5 *無ければ音声データ分スキップ
@@: move.l d5,d4
3: bsr make_select *選択肢のテーブルを作成
1: tst.l d0
bmi 2f
st (FLG_V)
bsr MScsrON
move.l d1,d0
bsr wait
@@: cmpi.b #103,d0 *スペースキーなら
bne @f
9: bsr MS_CHECK *マウスが押されるか
tst.w d0
bne @f
IOCS _B_KEYSNS *他のキーが
tst.l d0
beq 9b
IOCS _B_KEYINP *押されるまで
bsr key_chk
bra @b *ループ
@@: bsr MScsrOFF
cmpi.b #104,d0
bne @f
bsr resize
move.l W_Time,d1
bra 3b
@@: move.l TimeOut,d2
tst.b d0
beq @f
moveq.l #0,d2
cmpi.b #100,d0
beq @f
move.l Previous,d2
cmpi.b #101,d0
beq @f
move.l Next,d2
cmpi.b #102,d0
beq @f
move.l #-4,d2
cmpi.b #106,d0
beq @f
move.l #-6,d2
cmpi.b #107,d0
beq @f
move.l MenuErr,d2
cmp.b d6,d0
bhi @f
clr.l d2
move.b d0,d2
subq.b #1,d2
add.w d2,d2
add.w d2,d2
move.l 0(a0,d2.w),d0
move.l d0,d2
@@: move.l d2,d0
cmp.l d7,d0
bne 2f
tst.b SW_S
beq @f
cmpi.w #2,IMAGE_NUM
beq 2f
@@: tst.b MU_FLG
beq 4f
tst.l d1
bne @f
4: bsr PlayAudioMSF
move.l W_Time,d1
@@: clr.l d0
bra 1b
2: movem.l (sp)+,d1-d6/a0
rts
make_select:
movem.l d0-d2/a0-a1,-(sp)
move.l d4,d5
move.w SEL,d1
subq.w #1,d1
move.l d1,d2
lea.l M_TBL_J,a0
@@: bsr get_long
move.l d0,(a0)+
dbra d2,@b
lea.l M_TBL_X,a0
lea.l M_TBL_Y,a1
@@: bsr get_byte
bsr henkanx
move.w d0,(a0)+
bsr get_byte
bsr henkany
move.w d0,(a1)+
bsr get_byte
bsr henkanx
move.w d0,(a0)+
bsr get_byte
bsr henkany
move.w d0,(a1)+
dbra d1,@b
movem.l (sp)+,d0-d2/a0-a1
rts
henkanx:
movem.l d1,-(sp)
moveq.l #0,d1
move.b d0,d1
tst.b G_MODE
bne 1f
tst.w IMAGE_NUM
bne @f
lsr.w #1,d1
bra 2f
@@: cmpi.w #1,IMAGE_NUM
beq 2f
add.w d1,d1
bra 2f
1: move.w d1,d0
add.w d1,d1
add.w d0,d1
cmpi.w #2,IMAGE_NUM
beq 2f
lsr.w #1,d1
tst.w IMAGE_NUM
bne 2f
lsr.w #1,d1
2: add.w limitB,d1
add.w SW_LX,d1
move.w d1,d0
movem.l (sp)+,d1
rts
henkany:
movem.l d1,-(sp)
moveq.l #0,d1
move.b d0,d1
tst.w IMAGE_NUM
bne @f
lsr.w #1,d1
bra 1f
@@: cmpi.w #1,IMAGE_NUM
beq 1f
add.w d1,d1
1: add.w SW_LY,d1
move.w d1,d0
movem.l (sp)+,d1
rts
*------------------------------
* 連続再生の処理
*------------------------------
play_sub:
movem.l d1/d3-d6,-(sp)
clr.b MN_FLG
move.l d7,Now
bsr get_byte
clr.w d6
move.b d0,d6 *フレーム数
bsr get_long *このデータ不明
bsr get_long
move.l d0,Previous
bsr get_long
move.l d0,Next
add.l #25,d5 *意味の無いデータをスキップ
subq.b #1,d6
1: bsr get_long
move.l d5,d4 *PUSH
move.l d0,d5
bsr get_word
bsr pic_audio *画像と音声
2: tst.l d0
bmi 4f
st (FLG_V)
move.l W_Time,d0
bsr wait
@@: cmpi.b #103,d0 *スペースなら
bne @f
9: bsr MS_CHECK *マウスが押されるか
tst.w d0
bne @f
IOCS _B_KEYSNS *他のキーが
tst.l d0
beq 9b
IOCS _B_KEYINP *押されるまで
bsr key_chk
bra @b *ループ
@@: cmpi.b #104,d0
bne @f
bsr resize
bra 2b
@@: moveq.l #0,d3
cmpi.b #100,d0
beq 3f
move.l Previous,d3
cmpi.b #101,d0
beq 3f
cmpi.b #102,d0
beq @f
move.l #-4,d3
cmpi.b #106,d0
beq 3f
move.l #-6,d3
cmpi.b #107,d0
beq 3f
move.l d4,d5 *POP
dbra d6,1b
@@: move.l Next,d3
3: move.l d3,d0
4: movem.l (sp)+,d1/d3-d6
rts
*------------------------------
* 画像サイズ変更
*------------------------------
resize:
addq.w #1,IMAGE_NUM
cmpi.w #2,IMAGE_NUM
bls @f
clr.w IMAGE_NUM
bsr Wipe
@@: bsr l_space
bsr disp_pcd
rts
*------------------------------
* 画面消去
*------------------------------
Wipe:
st.b FLG_WP
tst.l V_FLAME
bge @f
tst.b SW_S
bne 1f
movem.l d0-d1,-(sp)
IOCS _WIPE
movem.l (sp)+,d0-d1
1: rts
@@: bsr GA_wipe
rts
*------------------------------
* 画像の表示位置決定
*------------------------------
l_space:
movem.l d0-d1/a0,-(sp)
lea.l XY_SP,a0
move.w IMAGE_NUM,d1
lsl.w #1,d1
move.w 0(a0,d1.w),d0
move.w d0,SW_LY
tst.l V_FLAME
bmi 1f
move.w 12(a0,d1.w),d0
bra @f
1: tst.b SW_S
beq @f
move.w 6(a0,d1.w),d0
@@: move.w d0,SW_LX
movem.l (sp)+,d0-d1/a0
rts
*------------------------------
* d0.lの時間キー入力を待つ
*------------------------------
wait:
move.l d0,d1
clr.l d0
move.w KEY_DATA,d0
beq @f
bpl 2f
clr.l d0
bra 2f
@@: bsr time_clr
@@: IOCS _B_KEYSNS
tst.l d0
beq 1f
bsr key_chk
tst.l d0
bne @f
bsr K_Clear *キーバッファクリア
1: bsr MS_CHECK
tst.l d0
bne 2f
bsr time_get
cmp.l d1,d0
bcs @b
clr.l d0
bra 2f
@@: IOCS _B_KEYINP
bsr key_chk
2: bsr K_Clear *キーバッファクリア
clr.w KEY_DATA
move.l d0,-(sp)
bsr time_get
sub.l d0,d1
bge @f
clr.l d1
@@: move.l (sp)+,d0
rts
*------------------------------
* キーバッファのクリア
*------------------------------
K_Clear:
movem.l d0,-(sp) *IOCSCALLを使うより
@@ move.w #6,-(sp) *DOSCALLの方が確実に
move.w #$ff,-(sp) *バッファを消去
DOS _KFLUSH *出来るようだ
addq.l #4,sp
tst.l d0
bne @b
movem.l (sp)+,d0
rts
*------------------------------
* B_KEYSNS B_KEYINPで得られた
* d0.lを都合のいいように変換
*------------------------------
key_chk:
movem.l d1-d2,-(sp)
move.b d0,d2
lsr.w #8,d0
moveq.l #100,d1
cmpi.b #$6*8+6,d0 * HOME
beq @f
moveq.l #101,d1
cmpi.b #$7*8+1,d0 * ROLL DOWN
beq @f
moveq.l #102,d1
cmpi.b #$7*8+0,d0 * ROLL UP
beq @f
moveq.l #103,d1
cmpi.b #$6*8+5,d0 * SPACE
beq @f
moveq.l #104,d1
cmpi.b #$7*8+2,d0 * UNDO
beq @f
moveq.l #105,d1
cmpi.b #$a*8+4,d0 * HELP
beq @f
moveq.l #106,d1
cmpi.b #$0*8+1,d0 * ESC
beq @f
moveq.l #107,d1
cmpi.b #$3*8+5,d0 * CR
beq @f
moveq.l #107,d1
cmpi.b #$9*8+6,d0 * ENTER
beq @f
moveq.l #0,d1
cmpi.b #'0',d2
bls @f
cmpi.b #'9',d2
bhi @f
move.b d2,d1
andi.b #$0f,d1
@@: move.l d1,d0
movem.l (sp)+,d1-d2
rts
*------------------------------
* 絵を表示して音声データ再生
*------------------------------
pic_audio:
movem.l d2-d4/a0,-(sp) *d0.wに$3?01が入った状態
lea.l AUDIO_BUF,a0
clr.l d2 *待時間合計を入れる
bsr get_word *絵の番号
bsr Name_set *絵の表示準備
bsr get_byte *表示解像度か?表示可能解像度か?
bsr get_byte *待時間1(1/2秒)
move.b d0,d2
add.l #10,d5 *意味不明データをスキップ
bsr get_byte
cmpi.b #$40,d0 *音声データか?
bne 2f
clr.l d0
moveq.l #1,d1
0: moveq.l #2,d3
1: bsr get_byte
move.b d0,d4 *10進データを16進数に変換
andi.b #$0f,d4 * もっとスマートな方法が
lsr.b #4,d0 * 有りそうなもんだが
mulu.w #10,d0
add.b d4,d0
move.b d0,(a0)+ *MSFデータ書き込み
dbra d3,1b
clr.b (a0)+
dbra d1,0b
clr.l d0
move.b E_MM,d0 *終了分を
sub.b S_MM,d0 *開始分から引いて
mulu.w #120,d0 *1/2秒に直して
add.l d0,d2 *待時間に足す
clr.l d0
move.b E_SS,d0 *終了秒を
add.l d0,d0 *2倍し
add.l d0,d2 *待時間に足して
move.b S_SS,d0 *開始秒を
add.l d0,d0 *2倍して
sub.l d0,d2 *待時間から引く
mulu.w #50,d2 *50倍すると1/100秒
move.b E_FF,d0 *終了フレーム(1/75秒)を
bsr ff2bs *1/100秒に変換
add.l d0,d2 *待時間に足して
clr.l d0
move.b S_FF,d0 *開始フレームを
bsr ff2bs *1/100秒に変換
sub.l d0,d2 *待時間合計から引く
clr.l d0
bsr get_byte *待時間2(1/2秒)
mulu.w #50,d0 *50倍(1/100秒)
add.l d0,d2 *待時間合計に足す
add.l #20,d5 *意味不明データをスキップ
bra 3f
2: subq.l #1,d5
clr.l (a0)
mulu.w #50,d2
3: addq.l #1,d2 *誤差補正の意味で +1
exg d2,d1 *d1に待時間合計を返す(1/100)
move.l d1,W_Time
bsr disp_pcd *絵の表示+演奏
movem.l (sp)+,d2-d4/a0
rts
*------------------------------
* 1/75を1/100に変換
*------------------------------
ff2bs:
mulu.w #100,d0 *100倍して
divu.w #75,d0 *75で割れば
swap d0 *1/100秒に
clr.w d0 *なる
swap d0
rts
*------------------------------
* PLAYLIST.PCDの内容をd0に読む
*------------------------------
get_byte:
move.b 0(a5,d5.l),d0
addq.l #1,d5
rts
get_word:
bsr get_byte
lsl.w #8,d0
bsr get_byte
rts
get_long:
bsr get_word
swap d0
bsr get_word
rts
*------------------------------
* a0.l からの文字列と
* Fnameの比較
*------------------------------
namechek:
movem.l a1,-(sp)
lea.l Fname,a1
@@: move.b (a0),d0
or.b (a1),d0
cmp.b (a0)+,(a1)+
bne @f
tst.b d0
bne @b
@@: movem.l (sp)+,a1
rts
*-------------------------------
* オーディオトラック再生
* CD-ROMドライバをコールするのみ
*-------------------------------
PlayAudioMSF:
tst.b SW_PF *Portforioモードか
beq @f *違ったらリターン
st.b MU_FLG
tst.l AUDIO_BUF *音声データは有るか
beq @f *無かったらリターン
movem.l d0,-(sp)
move.b #3,PAN *ステレオ
pea.l PAN *パンポット制御
move.w #$8005,-(sp) *コマンド番号
clr.w -(sp) *カレントドライブ
move.w #13,-(sp)
DOS _IOCTRL *ドライバコール
lea.l 10(sp),sp
pea.l AUDIO_BUF *MSF再生
move.w #$8001,-(sp) *コマンド番号
clr.w -(sp) *カレントドライブ
move.w #13,-(sp)
DOS _IOCTRL *ドライバコール
lea.l 10(sp),sp
movem.l (sp)+,d0
@@: rts
*----------------------------------
* time_clrからの時間を1/100秒で返す
*----------------------------------
time_get:
movem.l d1,-(sp)
IOCS _ONTIME
sub.l time,d0
bge @f
add.l #8640000,d0
@@: movem.l (sp)+,d1
rts
*------------------------------
* タイマーの初期化
*------------------------------
time_clr:
movem.l d0-d1,-(sp)
IOCS _ONTIME
move.l d0,time
movem.l (sp)+,d0-d1
rts
*------------------------------
* 絵の表示
*------------------------------
disp_pcd:
clr.w -(sp)
pea.l name_buff
DOS _OPEN
addq.l #6,sp
tst.l d0
bmi @f
move.w d0,FHdl
bsr PCD_MAIN
movem.l d0,-(sp)
move.w FHdl,-(sp)
DOS _CLOSE
addq.l #2,sp
movem.l (sp)+,d0
rts
@@: move.l #-1,d0
rts
*------------------------------
* 入力 d0.w 絵の番号
* 出力 name_buff
* 表示するファイル名
*------------------------------
Name_set:
movem.l d0-d1/a0-a1,-(sp)
lea.l r_name,a0
lea.l name_buff,a1
@@: move.b (a0)+,(a1)+
bne @b
subq.l #1,a1
bsr bin2asc
moveq.l #3,d1
@@: move.b d0,(a1)+
lsr.l #8,d0
dbra d1,@b
move.b #'.',(a1)+
move.b #'P',(a1)+
move.b #'C',(a1)+
move.b #'D',(a1)+
clr.b (a1)
movem.l (sp)+,d0-d1/a0-a1
rts
*------------------------------
* d0.wの数値をASCIIコードに変換
* d0.lへ ただし順番が逆
*------------------------------
bin2asc:
movem.l d1-d2,-(sp)
clr.l d1
move.w d0,d1
moveq.l #3,d2
@@: lsl.l #8,d0
divu.w #10,d1
swap d1
move.b d1,d0
ori.b #'0',d0
clr.w d1
swap d1
dbra d2,@b
movem.l (sp)+,d1-d2
rts
*------------------------------
* 固定データ
*------------------------------
.data
.align 4
XY_SP: .dc.w 192,128,0
.dc.w 160,64,0
.dc.w 288,192,0
FNAME1: .dc.b 'PLAYLIST.PCD',0
r_name: .dc.b '\PHOTO_CD\IMAGES\IMG',0
*------------------------------
* ワークエリア
*------------------------------
.bss
.align 4
name_buff:
.ds.b 32
Now:
.ds.l 1
Previous:
.ds.l 1
Next:
.ds.l 1
MenuErr:
.ds.l 1
TimeOut:
.ds.l 1
time:
.ds.l 1
M_TBL_X:
.ds.l 99
M_TBL_Y:
.ds.l 99
M_TBL_J:
.ds.l 99
AUDIO_BUF:
S_MM: .ds.b 1
S_SS: .ds.b 1
S_FF: .ds.b 1
.ds.b 1
E_MM: .ds.b 1
E_SS: .ds.b 1
E_FF: .ds.b 1
.ds.b 1
FHdl: .ds.w 1
W_Time:
.ds.l 1
KEY_DATA:
.ds.w 1
SEL:
.ds.w 1
PAN: .ds.b 1
MN_FLG: .ds.b 1
MU_FLG: .ds.b 1